package cn.skyclass.utils
{
	/**
	 * 对字符串的包装类，提供常规操作
	 */
	public class StringWrapper
	{
		/**
		 * value : 将要操作的字符串对象
		 */
		public function StringWrapper(value:String){
			this.value = value;
		}
		
		/**
		 * 根据一个字符串生成一个新的包装实例
		 */
		public static function newInstance(str:String):StringWrapper{
			return new StringWrapper(str);
		}
		
		protected var value:String;
		
		/**
		 * 获得一个合法的字符串
		 * 如果字符串为 null，则返回一个空字符串 ""；否则返回自身
		 */
		public function getValidValue():String{
			return value ? value : "";
		}
		
		
		/**
		 * 去除字符串左侧的空格
		 */
		public function leftTrim():String{
			return this.getValidValue().replace(/(^\s*)/g, "");
		}
		
		/**
		 * 去除字符串右侧的空格
		 */
		public function rightTrim():String{
			return this.getValidValue().replace(/(\s*$)/g, "");
		}
		
		/**
		 * 去除字符串两侧的空格
		 */		
		public function trim():String{
			return this.getValidValue().replace(/(^\s*)/g, "").replace(/(\s*$)/g, "");
		}				
		
		/**
		 * 是否以指定的字符开始
		 * offset : 开始匹配的偏移字符数
		 */
		public function startsWith(prefix:String, offset:int=0):Boolean{
			if(!this.value){ return false; }
			
			var i:int = this.value.indexOf(prefix, offset);
			return i == offset;
		}
		
		/**
		 * 是否以指定的字符结尾
		 */
		public function endsWith(suffix:String):Boolean{
			if(!this.value){ return false; }
			
			var i:int = this.value.lastIndexOf(suffix);
			return this.value.length == (suffix.length + i);
		}
		
		/**
		 * 强制字符串以指定的字符开始或是去掉指定的开始字符
		 */
		public function enforceStarts(prefix:String, needPrefix:Boolean=true):String{
			if(needPrefix){
				return this.startsWith(prefix) ? this.value : (prefix + this.value);
			}else if(this.startsWith(prefix)){
				return this.value.substring(prefix.length);
			}else{
				return this.value;
			}
		}
		
		/**
		 * 强制字符串以指定的字符结尾或是去掉指定的结尾字符
		 */
		public function enforceEnds(suffix:String, needSuffix:Boolean=true):String{
			if(needSuffix){
				return this.endsWith(suffix) ? this.value : (this.value + suffix);
			}else if(this.endsWith(suffix)){
				return this.value.substring(0, this.value.length - suffix.length);
			}else{
				return this.value;
			}
		}
		
		/**
		 * 获取指定长度的字符串
		 */
		public function limitedString(len:int, more:String="..."):String{
			var sour:String = this.value;
			
			if(!sour || (len <= 0)){ return sour; }
			
			if(sour.length <= len){
				return sour;
			}else if(len <= more.length){
				return sour.substring(0, len);
			}else{
				return sour.substring(0, len - more.length) + more;
			}
		}		
	}
}